#!/usr/bin/env node

const inquirer = require("inquirer"); // 用于命令行与开发者交互
const download = require("../download"); // 自定义工具-用于下载模板
const buildBaseTemplate = require("../template/buildBaseTemplate"); // 自定义工具-用于下载模板
const updatePackage = require("../updatePackage");
const updateHtml = require("../updateHtml");
const mkDir = require("../mkDir");
const t = require("../../config/dict");
const { boolChoies } = require("../../config");
const initDevelop = require("../initDevelop");
const { error, log } = require("../utils");
const autoBuild = require("../autoBuild");
const chalk = require("chalk");
const configQiankun = require("../configQiankun");
const configPWA = require("../configPWA");
const configMode = require("./configMode");
const base = require("./base");

const done = (program, callback) => {
  let next = base(program);

  if (callback && typeof callback === "function") {
    next = next.then((context) => {
      log("tip", {
        message: [
          "1)",
          t(context.lang, "设置项目"),
          context.name,
          t(context.lang, "配置"),
          "(",
          t(context.lang, "自动"),
          ").",
        ].join(" "),
      });
      return callback(context);
    });
  } else {
    next = next
      .then((context) => {
        return configMode(context);
      })
      .then((context) => {
        return context.metadata.projectMode === "auto"
          ? require("../configSource")(context)
          : context;
      })
      .then((context) => {
        return initDevelop(context);
      });
  }

  next
    .then((context) => {
      return mkDir(context);
    })
    .then((context) => {
      if (context.taskType === "initPackage") {
        log("tip", {
          message: [
            "3)",
            t(context.lang, "初始化"),
            "package.json",
            t(context.lang, "。"),
          ].join(" "),
        });
        return context;
      }
      if (!context.metadata.projectTypeConfig.url) {
        log("tip", {
          message: [
            "3)",
            t(context.lang, "构建项目"),
            t(context.lang, "。"),
          ].join(" "),
        });
        return buildBaseTemplate(context);
      } else {
        log("tip", {
          message: [
            "3)",
            t(context.lang, "拉取远程数据并构建"),
            t(context.lang, "。"),
          ].join(" "),
        });
        return download(context).then((target) => {
          // 下载项目模板
          return {
            ...context,
            downloadTemp: target.downloadTemp,
          };
        });
      }
    })
    .then((context) => {
      return context.metadata.projectTypeConfig.updatePackage
        ? updatePackage(context)
        : context;
    })
    .then((context) => {
      return context.metadata.projectTypeConfig.updatePackage
        ? updateHtml(context)
        : context;
    })
    .then((context) => {
      if (
        context.metadata.projectMode &&
        context.metadata.projectMode === "auto"
      ) {
        return context;
      }
      return context.metadata.projectTypeConfig.qiankun
        ? configQiankun(context)
        : context;
    })
    .then((context) => {
      if (
        context.metadata.projectMode &&
        context.metadata.projectMode === "auto"
      ) {
        return context;
      }
      return context.metadata.projectTypeConfig.pwa
        ? configPWA(context)
        : context;
    })
    .then((context) => {
      if (context.metadata.projectTypeConfig.dependencies) {
        if (
          context.metadata.projectMode &&
          context.metadata.projectMode === "auto"
        ) {
          return autoBuild(context);
        }
        return inquirer
          .prompt([
            {
              name: "projectAutoBuild",
              message: t(context.lang, "需要自动构建") + "?",
              default: "yes",
              pageSize: boolChoies.length + 2,
              type: "rawlist",
              choices: [...t(context.lang, boolChoies)],
            },
          ])
          .then((answers) => {
            let bool = answers.projectAutoBuild;
            if (bool === "yes") {
              return autoBuild(context);
            } else {
              return context;
            }
          });
      } else {
        return context;
      }
    })
    .then((context) => {
      if (context.taskType === "initPackage") {
        return context;
      }
      // 成功用绿色显示，给出积极的反馈
      log("success", {
        message: [t(context.lang, "项目构建成功"), t(context.lang, "。")].join(
          ""
        ),
      });
      return context;
    })
    .then((context) => {
      if (context.taskType === "initPackage") {
        log("success", {
          message: [
            t(context.lang, "初始化"),
            "package.json",
            t(context.lang, "完成"),
            t(context.lang, "。"),
          ].join(" "),
        });
        return context;
      }
      console.log("");
      log("tip", {
        message: [
          "4)",
          t(context.lang, "最后，执行以下命令"),
          t(context.lang, "。"),
        ].join(" "),
      });
      log("tip", { message: chalk.blue("cd " + context.metadata.projectDir) });
      if (
        (context.metadata.projectMode &&
          context.metadata.projectMode !== "auto") ||
        !context.metadata.projectMode
      ) {
        log("tip", {
          message: chalk.blue("npm i --registry " + context.source),
        });
      }
      log("tip", { message: chalk.blue("npm run <script>") });
    })
    .catch((err) => {
      // 失败了用红色，增强提示
      log("error", { message: err.message });
      error(err);
    });
};

module.exports = {
  done,
};
